home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / func3d.arj / FUENTE / PERSP.AS_ / PERSP.AS
Encoding:
Text File  |  1994-05-09  |  13.4 KB  |  640 lines

  1. ;
  2. ;   Fichero: PERSP.ASM
  3. ;
  4. ;   Versi≤n: 1.0
  5. ;     Autor: Antonio M. EstΘvez Lorenzo
  6. ; Prop≤sito: Dibuja superficies
  7. ;
  8. ; Para ensamblar: TASM /ml [/dc87] superf
  9. ;                      /ml   -> Sensible a may·sculas/min·sculas
  10. ;                      /dc87 -> Define la constante c87 (parßmetro opcional)
  11. ;                               Si no se incluye se emplerßn instruciones de
  12. ;                               emulaci≤n de coprocesador
  13.  
  14.  
  15.         .MODEL  large,Pascal
  16.  
  17.          LOCALS  @@
  18.  
  19.         .286
  20.  
  21. ifdef c87
  22.         .287
  23. elseifdef C87
  24.         .287
  25. else
  26.          EMUL
  27. endif
  28.  
  29.          EXTRN  C sin: PROC
  30.          EXTRN  C cos: PROC
  31.          EXTRN  Pascal @TSuperf@CalcCoord$qv: PROC
  32.          EXTRN  Pascal LINETO: PROC
  33.          EXTRN  Pascal MOVETO: PROC
  34.          EXTRN  Pascal POLYLINE: PROC
  35.          EXTRN  Pascal SETPIXEL: PROC
  36.          EXTRN  Pascal SELECTOBJECT: PROC
  37.          EXTRN  Pascal CREATEPEN: PROC
  38.         .CONST
  39.  
  40. cteRad   DQ     0.017453292519943296
  41. cte360   DD     360.0
  42. cteEnt   DW     1F3FH
  43.  
  44.         .DATA
  45.  
  46. Variables=      2
  47.  
  48. DatTmp   LABEL  BYTE
  49. DatModif DW     ?
  50. ErrorDat DW     ?
  51. AngGiro  DW     ?
  52. IntvGiro DW     ?
  53. NodosX   DW     ?
  54. NodosY   DW     ?
  55. OrgX     DW     ?
  56. OrgY     DW     ?
  57. Persp    DW     ?
  58. Rotar    DW     ?
  59. Dibujar  DW     ?
  60. MatGiro  DW     ?
  61. EscX     DQ     ?
  62. EscY     DQ     ?
  63. EscZ     DQ     ?
  64. SinXZ    DQ     ?
  65. CosXZ    DQ     ?
  66. SinYZ    DQ     ?
  67. CosYZ    DQ     ?
  68. CoefRedZ DQ     ?
  69. MatCos   DQ     9 DUP(?)
  70. MatSen   DQ     9 DUP(?)
  71. OrgEjeX  DQ     ?
  72. OrgEjeY  DQ     ?
  73. OrgEjeZ  DQ     ?
  74. CoordX   DD     ?
  75. CoordY   DD     ?
  76. CoordZ   DD     ?
  77. Tmp      DQ     ?
  78. OfsAngGiro EQU  Variables+OFFSET AngGiro-OFFSET DatTmp
  79.  
  80. TmpX     DQ     ?
  81. TmpY     DQ     ?
  82. TmpZ     DQ     ?
  83.  
  84. PuntoX   DW     ?
  85. PuntoY   DW     401 DUP(?)
  86. RMatGiro DQ     9 DUP(?)
  87.  
  88. ContX    DW     ?
  89. ContY    DW     ?
  90. DirCoord DW     ?
  91.  
  92. SinZ     DQ     ?
  93. CosZ     DQ     ?
  94. CosZX    DQ     ?
  95. SinZX    DQ     ?
  96. CosZY    DQ     ?
  97. SinZY    DQ     ?
  98. CosZZ    DQ     ?
  99. SinZZ    DQ     ?
  100.  
  101. RotaX    DW     ?
  102. RotaY    DW     ?
  103.  
  104. Sumar    MACRO  Oper
  105.          FADDP  Oper  
  106. ENDM
  107.  
  108. Restar   MACRO  Oper
  109.          FSUBP  Oper
  110. ENDM
  111.  
  112. Multp    MACRO  Oper
  113.          FMUL   Oper
  114. ENDM
  115.  
  116. Round    MACRO  Dest
  117.          FISTP  Dest
  118. ENDM
  119.  
  120. LDReal   MACRO  Ofs
  121.          FLD    Ofs
  122. ENDM
  123.  
  124. LDCoor   MACRO  Tipo
  125.          LES    BX,Coord&Tipo&
  126.          ADD    BX,DI
  127.          FLD    DWORD PTR ES:[BX]
  128. ENDM
  129.  
  130. SVCoor   MACRO  Tipo
  131.          LES    BX,Coord&Tipo&
  132.          ADD    BX,DI
  133.          FSTP   DWORD PTR ES:[BX]
  134. ENDM
  135.  
  136. Escala   MACRO  Coor
  137.          LDCoor Coor
  138.          Multp  Esc&Coor&
  139. ENDM
  140.  
  141. SigPunto MACRO
  142.          ADD    DI,DWORD
  143. ENDM
  144.  
  145. ProcPersp MACRO CoorX,CoorY,OperX,OperY
  146.          Escala Z
  147.          Escala Y
  148.          Escala X
  149.  
  150.          CALL   Rotar
  151.  
  152.      IFDIF <CoorX>,<0>
  153.          FXCH   ST(CoorX)
  154.      ENDIF
  155.          Round  RotaX
  156.      IFDIF <CoorY-1>,<0>
  157.          FXCH   ST(CoorY-1)
  158.      ENDIF
  159.          Round  RotaY
  160.          FWAIT
  161.          FSTP   Tmp
  162.  
  163.          MOV    CX,OrgX
  164.          OperX  CX,RotaX
  165.          MOV    DX,OrgY
  166.          OperY  DX,RotaY
  167. ENDM
  168.  
  169. MulMat   MACRO  Pos
  170.          FLD    QWORD PTR [BX+(Pos-1)*QWORD*3]
  171.          FMUL   TmpX
  172.          FLD    QWORD PTR [BX+(Pos-1)*QWORD*3+QWORD]
  173.          FMUL   TmpY
  174.          FADDP
  175.          FLD    QWORD PTR [BX+(Pos-1)*QWORD*3+QWORD*2]
  176.          FMUL   TmpZ
  177.          FADDP
  178. ENDM
  179.  
  180. CalcAng  MACRO  Ang,Eje
  181.          FILD   Ang
  182.          Multp  cteRad
  183.          SUB    SP,8
  184.          MOV    BX,SP
  185.          FSTP   QWORD PTR SS:[BX]
  186.          CALL   sin
  187.          FSTP   SinZ&Eje&
  188.          CALL   cos
  189.          FSTP   CosZ&Eje&
  190.          ADD    SP,8
  191. ENDM
  192.  
  193. Gira     MACRO  Eje
  194.          MOV    AX,Ang&Eje&
  195.          OR     AL,AL
  196.          JZ     @@No&Eje&
  197.          FLD    CosZ&Eje&
  198.          FSTP   CosZ
  199.          FLD    SinZ&Eje&
  200.          FSTP   SinZ
  201.          CALL   RotaEje&Eje&
  202. @@No&Eje&:
  203. ENDM
  204.  
  205.         .CODE
  206.  
  207. RotaEjeX PROC   NEAR
  208.          FLD    ST(1)
  209.          Multp  CosZ
  210.          FXCH   ST(2)
  211.          Multp  SinZ
  212.  
  213.          FLD    ST(3)
  214.          Multp  SinZ
  215.          FXCH   ST(4)
  216.          Multp  CosZ
  217.  
  218.          FADDP
  219.          FXCH   ST(3)
  220.          FSUBP  ST(2)
  221.          RET
  222. RotaEjeX ENDP
  223.  
  224. RotaEjeY PROC   NEAR
  225.          FLD    ST(2)
  226.          Multp  CosZ
  227.          FXCH   ST(3)
  228.          Multp  SinZ
  229.  
  230.          FLD    ST(1)
  231.          Multp  SinZ
  232.          FXCH   ST(2)
  233.          Multp  CosZ
  234.  
  235.          FADDP
  236.          FXCH   ST(3)
  237.          FSUBRP  
  238.          FXCH   ST(2)
  239.          RET
  240. RotaEjeY ENDP
  241.  
  242. RotaEjeZ PROC   NEAR
  243.          FLD    ST(0)
  244.          Multp  CosZ
  245.          FXCH   ST(1)
  246.          Multp  SinZ
  247.  
  248.          FLD    ST(2)
  249.          Multp  SinZ
  250.          FXCH   ST(3)
  251.          Multp  CosZ
  252.  
  253.          FADDP
  254.          FXCH   ST(2)
  255.          FSUBP
  256.          RET
  257. RotaEjeZ ENDP
  258.  
  259. RotaEje1 PROC   NEAR
  260.          FSTP   TmpX
  261.          FSTP   TmpY
  262.          FSTP   TmpZ
  263. MultMat: MOV    BX,OFFSET RMatGiro
  264.          MulMat 1
  265.          MulMat 2
  266.          MulMat 3
  267.          FXCH   ST(2)
  268.          RET
  269. RotaEje1 ENDP
  270.  
  271. RotaEje2 PROC   NEAR
  272.          LDReal OrgEjeX
  273.          Multp  EscX
  274.          FXCH   ST(1)
  275.          FSUB   ST,ST(1)
  276.          FSTP   TmpX
  277.          LDReal OrgEjeY
  278.          Multp  EscY
  279.          FXCH   ST(2)
  280.          FSUB   ST,ST(2)
  281.          FSTP   TmpY
  282.          LDReal OrgEjeZ
  283.          Multp  EscZ
  284.          FXCH   ST(3)
  285.          FSUB   ST,ST(3)
  286.          FSTP   TmpZ
  287.          CALL   MultMat
  288.          FADDP  ST(3),ST
  289.          FADDP  ST(3),ST
  290.          FADDP  ST(3),ST
  291.          RET
  292. RotaEje2 ENDP   
  293.  
  294. Axonom   PROC   NEAR
  295.          Escala Z
  296.          Escala Y
  297.          Escala X
  298.          CALL   Rotar
  299.                              
  300.          FLD    ST(0)
  301.          Multp  CosXZ
  302.          FLD    ST(2)
  303.          Multp  CosYZ
  304.          Restar
  305.          Round  RotaX
  306.  
  307.          Multp  SinXZ
  308.          FXCH   ST(1)
  309.          Multp  SinYZ
  310.          Sumar
  311.          FXCH   ST(1)
  312.          Multp  CoefRedZ
  313.          Restar
  314.          Round  RotaY
  315.          FWAIT
  316.  
  317.          MOV    CX,OrgX
  318.          SUB    CX,RotaX
  319.          MOV    DX,RotaY
  320.          ADD    DX,OrgY
  321.          SigPunto
  322.          RET
  323. Axonom   ENDP
  324.  
  325. Alzado   PROC   NEAR
  326.          ProcPersp 0,2,SUB,SUB
  327.          SigPunto
  328.          RET
  329. Alzado   ENDP
  330.  
  331. Perfil   PROC   NEAR
  332.          ProcPersp 1,2,ADD,SUB
  333.          SigPunto
  334.          RET
  335. Perfil   ENDP
  336.  
  337. Planta   PROC   NEAR
  338.          ProcPersp 0,1,SUB,ADD
  339.          SigPunto
  340.          RET
  341. Planta   ENDP
  342.  
  343.  
  344. GradToRad PROC   C Num: QWORD
  345.          PUBLIC  C GradToRad
  346.          FLD     Num
  347.          FLD     cte360
  348.          FDIVR   ST,ST(1)
  349.          FSTCW   ContX
  350.          FLDCW   cteEnt
  351.          FRNDINT
  352.          FLDCW   ContX
  353.          FMUL    cte360
  354.          FSUBP
  355.          Multp   cteRad
  356.          RET
  357. GradToRad ENDP
  358.  
  359.  
  360. InitMatGiro PROC NEAR
  361.          XOR    BX,BX
  362.          MOV    CL,3
  363. @@0:     MOV    CH,3
  364. @@1:     CMP    CH,CL
  365.          JE     @@2
  366.          LDReal [BX].MatSen
  367.          Multp  SinZ
  368.          JMP    SHORT @@3
  369. @@2:     FLD1
  370. @@3:     LDReal CosZ
  371.          FLD1
  372.          Restar
  373.          Multp  [BX].MatCos
  374.          Sumar
  375.          FSTP   QWORD PTR [BX].RMatGiro
  376.          ADD    BX,QWORD
  377.          DEC    CH
  378.          JNZ    @@1
  379.          DEC    CL
  380.          JNZ    @@0
  381. NoInit:  RET
  382. InitMatGiro ENDP                                
  383.  
  384. InitProc PROC   C tpPersp: WORD, tpRotar: WORD, tpDibujo: WORD, tpEje: WORD, \
  385.                    dPersp: DWORD, dRotar: DWORD, dDibujo: DWORD, dMatGiro: DWORD
  386.          PUBLIC C InitProc
  387.          MOV    DX,tpPersp
  388.          MOV    AX,OFFSET Alzado
  389.          CMP    DL,1
  390.          JZ     @@1
  391.          MOV    AX,OFFSET Perfil
  392.          CMP    DL,2
  393.          JZ     @@1
  394.          MOV    AX,OFFSET Planta
  395.          CMP    DL,3
  396.          JZ     @@1
  397.          MOV    AX,OFFSET Axonom
  398. @@1:     LES    BX,dPersp
  399.          MOV    ES:[BX],AX
  400.          MOV    DX,tpRotar
  401.          MOV    CX,OFFSET NoInit
  402.          MOV    AX,OFFSET RotaEjeX
  403.          OR     DL,DL
  404.          JZ     @@2
  405.          MOV    AX,OFFSET RotaEjeY
  406.          CMP    DL,1
  407.          JZ     @@2
  408.          MOV    AX,OFFSET RotaEjeZ
  409.          CMP    DL,2
  410.          JZ     @@2
  411.          MOV    CX,OFFSET InitMatGiro 
  412.          MOV    AX,OFFSET RotaEje1
  413.          CMP    tpEje,0
  414.          JNZ    @@2
  415.          MOV    AX,OFFSET RotaEje2
  416. @@2:     LES    BX,dRotar
  417.          MOV    ES:[BX],AX
  418.          LES    BX,dMatGiro
  419.          MOV    ES:[BX],CX
  420.          MOV    AX,tpDibujo
  421.          MOV    CX,OFFSET DibPuntos
  422.          CMP    AX,1
  423.          JZ     @@3
  424.          MOV    CX,OFFSET DibIntvX
  425.          CMP    AX,2
  426.          JZ     @@3
  427.          MOV    CX,OFFSET DibIntvY
  428.          CMP    AX,3
  429.          JZ     @@3
  430.          MOV    CX,OFFSET DibMalla
  431. @@3:     LES    BX,dDibujo
  432.          MOV    ES:[BX],CX
  433.          RET
  434. InitProc ENDP 
  435.  
  436. @TSuperf@GiroInicial$qiiii PROC AngX: WORD, AngY: WORD, AngZ: WORD, \
  437.                                 CalcDat: WORD, @Self: DWORD
  438.          PUBLIC @TSuperf@GiroInicial$qiiii
  439.          PUSH   DI
  440.          CMP    CalcDat,0
  441.          JNZ     @@1
  442.          JMP     @@2
  443. @@1:     CalcAng AngX,X
  444.          CalcAng AngY,Y
  445.          CalcAng AngZ,Z
  446.          MOV    DirCoord,0
  447. @@2:     MOV    DI,DirCoord
  448.          LDCoor Z
  449.          LDCoor Y
  450.          LDCoor X
  451.          Gira   X
  452.          Gira   Y
  453.          Gira   Z
  454.          SVCoor X
  455.          SVCoor Y
  456.          SVCoor Z
  457.          SigPunto
  458.          MOV    DirCoord,DI
  459.          POP    DI
  460.          RET
  461. @TSuperf@GiroInicial$qiiii ENDP
  462.  
  463. @TSuperf@Dibujar$qpx5HDC__i PROC Hdc: WORD, Dir: WORD, @Self: DWORD
  464.          PUBLIC @TSuperf@Dibujar$qpx5HDC__i
  465.          PUSH   SI
  466.          PUSH   DI
  467.          MOV    AX,DS
  468.          MOV    ES,AX
  469.          LDS    SI,@Self
  470.          ADD    SI,Variables
  471.          MOV    DI,OFFSET DatTmp
  472.          MOV    CX,(OFFSET Tmp-OFFSET DatTmp)/2
  473.          CLD
  474.          REP    MOVSW
  475.          MOV    DS,AX
  476.  
  477.          CMP    ErrorDat,0
  478.          JNZ    @@0
  479.          CMP    DatModif,0
  480.          JZ     @@1
  481.          LES    BX,@Self
  482.          PUSH   ES
  483.          PUSH   BX
  484.          CALL   @TSuperf@CalcCoord$qv
  485.          OR     AX,AX
  486.          JZ     @@1
  487. @@0:     MOV    AX,-1
  488.          JMP    @@5
  489. @@1:     MOV    AX,IntvGiro
  490.          MUL    Dir
  491.          ADD    AX,AngGiro
  492.          MOV    CX,360
  493.          OR     AX,AX
  494. @@2:     JGE    @@3
  495.          ADD    AX,CX
  496.          JMP    @@2
  497. @@3:     CMP    AX,CX
  498.          JL     @@4
  499.          SUB    AX,CX
  500.          JMP    @@3
  501. @@4:     MOV    AngGiro,AX
  502.          LES    BX,@Self
  503.          MOV    ES:[BX+OfsAngGiro],AX
  504.          CalcAng AngGiro
  505.  
  506.          CALL   MatGiro
  507.          XOR    DI,DI
  508.          MOV    SI,OFFSET PuntoX
  509.          MOV    AX,NodosX
  510.          MOV    ContX,AX
  511.          CALL   Dibujar
  512.          MOV    AX,AngGiro
  513. @@5:     POP    DI
  514.          POP    SI
  515.          RET
  516. @TSuperf@Dibujar$qpx5HDC__i ENDP
  517.  
  518. DibMalla PROC   NEAR
  519. @@1:     CALL   Persp
  520.          MOV    [SI],CX
  521.          MOV    [SI+2],DX
  522.          ADD    SI,4
  523.          DEC    ContX
  524.          JNS    @@1
  525. @@2:     MOV    AX,NodosY
  526.          MOV    ContY,AX
  527. @@3:     PUSH   Hdc
  528.          MOV    SI,OFFSET PuntoX
  529.          PUSH   DS
  530.          PUSH   SI
  531.          MOV    AX,NodosX
  532.          INC    AX
  533.          PUSH   AX
  534.          CALL   POLYLINE
  535.          DEC    ContY
  536.          JS     @@5
  537.          MOV    AX,NodosX
  538.          MOV    ContX,AX
  539. @@4:     CALL   Persp
  540.          PUSH   Hdc
  541.          PUSH   CX
  542.          PUSH   DX
  543.          PUSH   Hdc
  544.          XCHG   CX,[SI]
  545.          XCHG   DX,[SI+2]
  546.          PUSH   CX
  547.          PUSH   DX
  548.          CALL   MOVETO
  549.          CALL   LINETO
  550.          ADD    SI,4
  551.          DEC    ContX
  552.          JNS    @@4
  553.          JMP    @@3
  554. @@5:     RET
  555. DibMalla ENDP
  556.  
  557. DibPuntos PROC  NEAR
  558.          XOR    SI,SI
  559. @@1:     MOV    AX,NodosY
  560.          MOV    ContY,AX
  561. @@2:     CALL   Persp
  562.          PUSH   Hdc
  563.          PUSH   CX
  564.          PUSH   DX
  565.          INC    CX
  566.          PUSH   0
  567.          PUSH   SI
  568.          CALL   SETPIXEL
  569.          DEC    ContY
  570.          JNS    @@2
  571.          DEC    ContX
  572.          JNS    @@1 
  573.          RET
  574. DibPuntos ENDP
  575.  
  576. DibIntvX PROC   NEAR
  577. @@1:     CALL   Persp
  578.          MOV    [SI],CX
  579.          MOV    [SI+2],DX
  580.          ADD    SI,4
  581.          DEC    ContX
  582.          JNS    @@1
  583. @@2:     MOV    AX,NodosY
  584.          MOV    ContY,AX
  585. @@3:     PUSH   Hdc
  586.          MOV    SI,OFFSET PuntoX
  587.          PUSH   DS
  588.          PUSH   SI
  589.          MOV    AX,NodosX
  590.          INC    AX
  591.          PUSH   AX
  592.          CALL   POLYLINE
  593.          DEC    ContY
  594.          JS     @@5
  595.          MOV    AX,NodosX
  596.          MOV    ContX,AX
  597. @@4:     CALL   Persp
  598.          MOV    [SI],CX
  599.          MOV    [SI+2],DX
  600.          ADD    SI,4
  601.          DEC    ContX
  602.          JNS    @@4
  603.          JMP    @@3
  604. @@5:     RET
  605. DibIntvX ENDP
  606.  
  607. DibIntvY PROC   NEAR
  608. @@1:     CALL   Persp
  609.          MOV    [SI],CX
  610.          MOV    [SI+2],DX
  611.          ADD    SI,4
  612.          DEC    ContX
  613.          JNS    @@1
  614. @@2:     MOV    AX,NodosY
  615.          MOV    ContY,AX
  616. @@3:     DEC    ContY
  617.          JS     @@5
  618.          MOV    SI,OFFSET PuntoX
  619.          MOV    AX,NodosX
  620.          MOV    ContX,AX
  621. @@4:     CALL   Persp
  622.          PUSH   Hdc
  623.          PUSH   CX
  624.          PUSH   DX
  625.          PUSH   Hdc
  626.          XCHG   CX,[SI]
  627.          XCHG   DX,[SI+2]
  628.          PUSH   CX
  629.          PUSH   DX
  630.          CALL   MOVETO
  631.          CALL   LINETO
  632.          ADD    SI,4
  633.          DEC    ContX
  634.          JNS    @@4
  635.          JMP    @@3
  636. @@5:     RET
  637. DibIntvY ENDP
  638.  
  639.          END
  640.